# 操作数据库的类
import pymysql

class DB(object):

    def __init__(self,host="localhost",port=3316,user="root",password="654321",charset="utf8",database="woniubook",cursortype="dict",**kwargs):
        """
        :param host: 数据库地址
        :param port: 数据库端口号
        :param user: 数据用户名
        :param password: 数据库密码
        :param charset: 操作字符集
        :param database: 指定数据库名
        :param cursortype: 游标类型，默认是dict-->字典，如果为tuple-->返回结果是元祖
        :param kwargs: 连接数据库的额外参数
        """

        self.__db_info={"host":host,"port":port,"user":user,"password":password,"charset":charset,"database":database}
        self.__db_info.update(kwargs) # 补充其他参数
        self.__cursortype=cursortype
        self.__connect()


        # 能连接默认数据
        # 创建游标
    def __connect(self):
        self.__cnn=pymysql.connect(**self.__db_info)
        if self.__cursortype=="dict":
            self.__cur = self.__cnn.cursor(pymysql.cursors.DictCursor)
        elif self.__cursortype=="tuple":
            self.__cur=self.__cnn.cursor()
        else:
            # 报错？如果报错？
            raise Exception("传入的cursortype参数错误！")

    def update(self,sql,sql_args=None):
        """
        修改数据
        :param sql: sql语句
        :param sql_args: sql语句的参数
        :return: 返回受印象的行数 （整数）
        """
        try:
            self.__cnn.begin()  #开启事务
            rows = self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
            if rows<1:
                print(f"Warnning: 受印象的行数是0，可能你的sql语句有错误。( {sql} )")
            self.__cnn.commit()   #提交事务

        except:
            print()
        else:
            return rows

    def query(self,sql,sql_args=None):
        """
        :param sql:  查询语句
        :param sql_args:  查询语句的参数
        :return: 返回 （行数，列名，数据）
        """
        # 返回结果 【可以是列表（不要忘记高速我列名是什么），或  字典】
        try:
            rows=self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
            data=self.__cur.fetchall()
            fields=[i[0] for i in self.__cur.description]               # 列名
        except:
            pass
        else:
            return data

    def __del__(self):
        """关闭游标，关闭连接"""
        try:
            self.__cur.close()
            self.__cnn.close()
        except:
            pass

db = DB()




name='feiyang'


if __name__ == '__main__':
    woniusales=DB(cursortype="dict")
    user=woniusales.query("select * from user ")
    print("用户有--->",user)

    # result=woniusales.update("update user set realname='管理员' where userid=5")
    # print("结果-->",result)






